package com.xkh.rocketmq.controller;

import com.xkh.rocketmq.service.RocketMQService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author xkh
 * 2020/10/14
 * 细节:
 * 1.重发机制(无法确认第三方服务器商是否宕机)
 * 2.修改状态需要加版本号按断，防止因为处理过慢，已经消费过了，导致消息重发
 * 3.为了确保不存在重复消费，每次消费的ID存入到redis中
 * <p>
 * 消息可靠性投递、重复消费、消息积压
 * 1.如何知道消息是否丢失 Producer每个消息添加一个连续递增的序号，Consumer检测到消息序号不连续，则丢失消息
 * 2.RocketMQ不保证消息不重复，如果业务需要保证消息不重复，需要自己在消费端的业务中自己去重，可用日志表处理消息的ID去重
 * 对于消息不可丢失应用，务必要有消息重发机制 某些应用如果不关注消息是否发送成功，请直接使用sendOneWay方法发送消息
 * <p>
 * Topic 表示消息的第一级类型    Tag 表示消息的第二级类型     Queue 一个topic下，我们可以设置多个queue(消息队列)
 */
@RestController
@Slf4j
public class TestController {

    @Autowired
    private RocketMQService rocketMQService;

    @GetMapping("/test1")
    public boolean test1() {
        return rocketMQService.test1("123");
    }

    @GetMapping("/test2")
    public boolean test2() {
        return rocketMQService.test2("123");
    }

    @GetMapping("/test3")
    public boolean test3() {
        Long orderId1 = 111111122L;
        Long orderId2 = 111111123L;
        rocketMQService.test3(orderId1, "创建订单");
        rocketMQService.test3(orderId2, "创建订单");
        rocketMQService.test3(orderId1, "订单付款");
        rocketMQService.test3(orderId1, "订单结束");
        rocketMQService.test3(orderId2, "订单付款");
        rocketMQService.test3(orderId2, "订单结束");
        return true;
    }
}
